#!/bin/sh
###############################################################################
##  Author    : xuezhoyi
##  Name      : edw_function.sh
##  Functions : Define all common function
##  Purpose   : 
##  Revisions or Comments
##  VER        DATE        AUTHOR           DESCRIPTION
##---------  ----------  ---------------  ------------------------------------ 
##  1.0      2017-05-22  xuezhouyi        1. CREATED THIS SHELL.
##  2.0      2019-02-12  陈贰浩           2. 将日期计算更改为shell计算，以支持db2数据库
###############################################################################

# . ${0%`basename ${0}`}edw_parm.sh

#获取当前时间
function NOW(){
    echo $(date +"%Y/%m/%d %H:%M:%S")
}

# 计算时间差
function DIF_TIME(){
    START_TIME=${1}
    END_TIME=${2}
    DIF_SECOND=$(($(date +%s -d "${END_TIME}")-$(date +%s -d "${START_TIME}")))
    echo ${DIF_SECOND}
 #   echo $(date "+%H:%M:%S" -d @$((${DIF_SECOND}-28800)))
}

# BEGIN & END
function BEGIN(){
    echo -e "[Begin: $(date +%F) $(date +%T)]"
}
function END(){
    echo -e "[End: $(date +%F) $(date +%T)]"
}

# Log
function LOGGER(){
    echo -e "\n$(date +%F) $(date +%T) [${1}]: ${2}"
}



# If date
function IF_DATE(){
    if [[ -n "${1}" && $(expr length ${1}) -eq 8 ]];then
        cal ${1:6:2} ${1:4:2} ${1:0:4} >> /dev/null 2>&1
        if [[ $? -eq 0 || ${1:4:2} -eq 13 ]];then
            echo 0
        else
            echo 1
        fi
    else
        echo 1
    fi
}

# UPPER LOWER
function UPPER(){
    echo "$(echo ${1} | tr [:lower:] [:upper:])"
}
function LOWER(){
    echo "$(echo ${1} | tr [:upper:] [:lower:])"
}

# Day
function GET_CURR_DATE(){
    echo "$(date -d "${1}" +%Y%m%d)"
}
function GET_PREV_DATE(){
    echo "$(date -d "-1 days ${1}" +%Y%m%d)"
}
function GET_NEXT_DATE(){
    echo "$(date -d "1 days ${1}" +%Y%m%d)"
}
function GET_DAYS(){
    echo "$(date -d "${2} days ${1}" +%Y%m%d)"
}
function GET_LAST_YEAR_DATE(){
    echo "$(date -d "-12 months ${1}" +%Y%m%d)"
}



:<<!
2018-11-16 ChenErHao
增加shell计算方法，增加带结转日期计算
输入：八位无分隔符日期格式  YYYYMMDD
      相对时间，单位月
输出：八位无分隔符日期格式  YYYYMMDD
参数计算分三类：(不考虑结转期)
 1、同期值
 2、相对月末值
 3、季末值
其他日期均可根据这三类进行简单的截取拼接完成
!

#功能:同期值计算
#示例:F_CYC_DATE 20180131 -1
function F_CYC_DATE(){
  V_DATE=$1
  V_NEXT_MON=$2
  R_DATE=$(date -d "${V_NEXT_MON}month ${V_DATE}" +%Y%m%d)
  if [ ${V_DATE:6:2} == ${R_DATE:6:2} ];then
    echo ${R_DATE}
  else
    echo $(F_END_DATE ${V_DATE} ${V_NEXT_MON})
  fi

}

#相对月末值计算
#示例:F_END_DATE 20180131 -1
function F_END_DATE(){
  V_DATE=$1
  V_NEXT_MON=$((${2}+1))
  V_FIRST_DAY=${V_DATE:0:6}01
  R_DATE=$(date -d "${V_NEXT_MON}month ${V_FIRST_DAY}" +%Y%m%d)
  echo $(date -d "-1day $R_DATE" +%Y%m%d)
}

#计算季末月末值
#示例:F_QUARTER_DATE 20180131 -1
function F_QUARTER_EDATE(){
  V_DATE=$1
  V_NEXT_QUA=$2
  V_NEXT_MON=$((${V_NEXT_QUA}*3)) #根据季度计算相对月份
  V_QUARTER=$(F_CYC_DATE ${V_DATE} ${V_NEXT_MON})  #获取季度同期值
  #计算该月份所在季度的季度末月份
  V_YEAR=${V_QUARTER:0:4}
  V_MON=$(((${V_QUARTER:0:6}%${V_YEAR}+2)/3*3))
  V_QUARTER_END=$(date -d "${V_YEAR}/${V_MON}/01" +"%Y%m%d")
  echo $(F_END_DATE ${V_QUARTER_END} 0)    #取该季度月末值
}

#计算季初值月末值
#示例:F_QUARTER_DATE 20180131 -1
function F_QUARTER_SDATE(){
  V_DATE=$1
  V_NEXT_QUA=$2
  V_NEXT_MON=$((${V_NEXT_QUA}*3)) #根据季度计算相对月份
  V_QUARTER=$(F_CYC_DATE ${V_DATE} ${V_NEXT_MON})  #获取季度同期值
  #计算该月份所在季度的季度末月份
  V_YEAR=${V_QUARTER:0:4}
  V_MON=$(((${V_QUARTER:0:6}%${V_YEAR}+2)/3*3-2))
  V_QUARTER_END=$(date -d "${V_YEAR}/${V_MON}/01" +"%Y%m%d")
  echo $(F_END_DATE ${V_QUARTER_END} 0)    #取该月月末值
}




#计算带结转日期 结转期默认 YYYY0000
#示例: V_M_EDATE_OVER 20180131 -1
#
function F_M_EDATE_OVER(){ 
 #取年份
  YEAR=${1:0:4}
 #取月份
  MONTH=$((${1:0:6}%${YEAR}))
 #加的月份  负数则为减
  N=${2}

  #将年份按照13个月 转换成对应的总月数
  SUM_MON=$((${YEAR}*13+${MONTH}))
  #对月份做运算
  MON=$((${SUM_MON}+${N}))
  #对计算结果对13取整作为年份
  Y=$((${MON}/13))
  #计算结果对13取余作为月份
  M=$((${MON}%13))
  #对月份小于10月的做加0处理
  if [[ ${#M} -eq 1 ]]; then
     M=0${M}
  fi
  #对于结转月直接输出
  if [[ ${M} == "00" ]]; then
    DT=${Y}0000
    echo ${DT}
  else
    #对于正常日期，做取月末处理(本月月初加一月，再减一天得到本月月末)
    DT=${Y}${M}01
    echo $(date -d "${DT} +1MONTH -1DAY" +%Y%m%d)
  fi
}

